# -*- coding: utf-8 -*-
__author__ = 'Paul'
import random
from zope import schema
from zope.formlib import form
from zope.interface import implements
from zope.component import getMultiAdapter
from plone.app.portlets.portlets import base
from plone.memoize.instance import memoize
from plone.portlets.interfaces import IPortletDataProvider
from DateTime import DateTime
from Products.Five.browser.pagetemplatefile import\
    ViewPageTemplateFile
from Products.CMFCore.utils import getToolByName
from Products.bpContents import _
from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
from Acquisition import aq_inner
from plone.memoize.compress import xhtml_compress
from Products.bpContents.articulo import IArticulo
from Products.bpContents.galeria import IGaleria
from Products.bpContents.evento import IEvento
from zope.schema.interfaces import IVocabularyFactory
from Products.bpContents.utils import Utilidades
from zope.site.hooks import getSite
import unicodedata
from Acquisition import aq_parent,aq_base,aq_inner
 
class CanalesVocabulary(object):
    implements(IVocabularyFactory)

    def __call__(self,context):
        items = []

        site = context

        catalogo = getToolByName(site, 'portal_catalog', None)
        principal=site.restrictedTraverse("home/intereses", default=None)
        result=[SimpleTerm("","sin prioridad")]
        for folder in catalogo(path={'query': "/".join(principal.getPhysicalPath()), 'depth': 1}):
            titulito=self.elimina_tildes(folder.Title.decode('utf8'))
            idcito=folder.id
            urlito=folder.getPath()
            result.append(SimpleTerm(urlito,idcito))

        return SimpleVocabulary(result)


    def elimina_tildes(self,s):
        return ''.join((c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn'))




CanalesVocabularyFactory = CanalesVocabulary()




class IInteresesPortlet(IPortletDataProvider):
    count = schema.Int(title=_(u'Number of items to display'),
        description=_(u'How many items to list.'),
        required=True,
        default=3)

    canal = schema.Choice(
        title=_(u"Canal"),
        vocabulary='bp.CanalesVocab',
    )
    categoria = schema.Choice(
        title=_(u"Categoria"),
        vocabulary='bp.CanalesVocab',
    )

class Assignment(base.Assignment):
    implements(IInteresesPortlet)

    def __init__(self, count=5,canal=[], categoria=[]):
        self.count = count
        self.canal = canal
        self.categoria=categoria

    @property
    def title(self):
        cadena=""
        try:
            cadena="Intereses: "+self.data.canal.split("/")[-1]
        except :
            cadena="Intereses"

        return cadena


class Renderer(base.Renderer):
    ##_template = ViewPageTemplateFile('intereses_portlet.pt')
    render = ViewPageTemplateFile('intereses_portlet.pt')


    def __init__(self, *args):
        base.Renderer.__init__(self, *args)
        self.idCanal=""
        self.idDestacado=""
        context = aq_inner(self.context)
        portal_state = getMultiAdapter((context, self.request), name=u'plone_portal_state')
        self.anonymous = portal_state.anonymous()
        self.portal_url = portal_state.portal_url()
        self.typesToShow = portal_state.friendly_types()

        plone_tools = getMultiAdapter((context, self.request), name=u'plone_tools')
        self.catalog = plone_tools.catalog()
        self.portal = getMultiAdapter((self.context, self.request),
            name=u'plone_portal_state').portal()
        self.canalIntereses=""


    @property
    def available(self):
        return True


    def recent_items(self):
        return self._data()

    def recently_modified_link(self):
        return '%s/recently_modified' % self.portal_url


    def masTitulos(self):
        """devuelve el titulo de ver mas por tipo de interes"""
        r=""
        if self.canalIntereses=="Apoyo a la Educación":
            r="Y también..."
        elif self.canalIntereses=="Curiosidades":
            r="Otras curiosidades"
        elif self.canalIntereses=="Investigación":
            r="Anteriores..."
        elif self.canalIntereses=="Recreación":
            r="Vero todos..."
        else:
            r="Además"
        return r

    def masTexto(self):
        """Devuelve un texto del enlace ver mas"""
        if self.canalIntereses=="Apoyo a la Educación":
            r="ver más cosas para el cole"
        elif self.canalIntereses=="Curiosidades":
            r="otras curiosidades"
        elif self.canalIntereses=="Investigación":
            r="ver más"
        else:
          r="además"
        return r

    def getArticulos(self):
        resultado = []
        flag=-1
        cutString=100

        dameUnoMas=False

        uti=Utilidades()
        total=[e['id'] for e in uti.dameNovedades(self.context,self.request,self.catalog,self.data.count)]

        for art in self._data():
            if art.id in total:
                continue

            listaTemas=[]
            agregadas=[]

            if flag+1 == self.data.count and not dameUnoMas:
                break

            if art.id!= self.idDestacado:

                padreObj=self.portal.unrestrictedTraverse(art.getPath())

                if hasattr(padreObj,'categorias'):
                    listaTemas=self.getListaCategoria(padreObj)
                    if not listaTemas:
                        listaTemas=self.getListaSubject(padreObj)

                else:
                    listaTemas=self.getListaSubject(padreObj)
                    if not listaTemas:
                        listaTemas=None

                if len(art.Description)>cutString:
                    subStrRes=art.Description[:cutString][0:art.Description[:cutString].rfind(" ")]+" ..."
                else:
                    subStrRes=art.Description
                articulo={
                    "id":art.id,
                    "categoria":False,
                    "titulo":art.Title,
                    "resumen":subStrRes,
                    "url":art.getURL(),
                    "temas":listaTemas,
                    "imagen":self.getIMG("/".join(padreObj.getPhysicalPath())),
                }

                resultado.append(articulo)

            else:
                dameUnoMas=True
            flag=flag+1

        if len(resultado)>0:
            return resultado
        else:
            return None

    def getListaCategoria(self,art):
        """Devuelve una lista con las categorias"""
        if hasattr(art,"categorias"):
            if art.categorias>0:
                listadoTmp=art.categorias
                agregadas=[]
                for pal in listadoTmp:
                    objTitulo=""
                    objUid=""
                    if pal.find(":")>=0:
                        objUid=pal.split(":")[0]
                        objTitulo=pal.split(":")[1]
                    if objTitulo.find(" - ")>=0:
                        agregadas.append((objTitulo.split(" - ")[1],'/home/intereses/'+self.idCanal+'/@@categoriaList_view?rama='+ objUid))
                    else:
                        agregadas.append((objTitulo,objUid))
                return {"categorias":agregadas}
        else:
            return None

    def getListaSubject(self,art):
        """Devuelve un listado de palabras tags"""

        if hasattr(art,'subject'):
            if art.Subject>0:
                listSub=[]
                for pal in art.Subject():
                    listSub.append(pal)

                return {"subject":listSub}
            else:
                return None

    def getUrlCanal(self):
        """Devuelve la ruta relativa como se pasa en la varible canal"""
        return self.data.canal

    def getCanalId(self):
        """devuelve el valor correspondiente al id"""
        strA=self.data.canal
        r=strA[strA.rindex("/")+1:]
        return r

    def getCanal(self):
        """Devuelve el título de la seccion"""
        r=self.getCanalId()
        try:
            if r=="apoyo_educacion" or r=="apoyo-a-la-educacion" or r=="apoyo-a-la-educacio":
                r="Apoyo a la Educación"
            elif r=="recreacion":
                r="Recreación"
            elif r=="investigacion":
                r="Investigación"
            else:
                r=r[0].upper()+r[1:]
        except :
            r=r[0].upper()+r[1:]

        self.canalIntereses=r

        return r

    def getDestacado(self):
        ##recreaFolder= self.getContainer(folder.encode('utf8'))
        ##cuando busca documento hace referencia a l campo "documento" que es el destacado del directorio
        resultado=[]
        listaTemas=[]
        cutString=100
        canalFolder = aq_base(self.portal["home"]["intereses"][self.idCanal])

        if hasattr(canalFolder,"documento"):
            if canalFolder.documento!=None and len(canalFolder.documento)>0 :
                art=canalFolder.documento[0].to_object
                if art!=None:
                    self.idDestacado=art.id
                    if len(art.Description())>cutString:
                        subStrRes=art.Description()[:cutString][0:art.Description()[:cutString].rfind(" ")]+" ..."
                    else:
                        subStrRes=art.Description()
                    articulo={
                        "id":art.id,
                        "categoria":aq_parent(art).Title(),
                        "titulo":art.Title,
                        "resumen":subStrRes,
                        "url":art.absolute_url(),
                        "temas":[],
                        "imagen":self.getIMG("/".join(art.getPhysicalPath())),
                    }
                    return articulo
                else:
                    arts=self.getArticulos()
                    if arts:
                        self.idDestacado=arts[0]["id"]
                        return arts[0]
                    else:
                        return None
            else:
                arts=self.getArticulos()

                if len(arts)>0:
                    self.idDestacado=arts[0]["id"]
                    return arts[0]
                else:
                    return None
        else:
            return None

    def getIMG(self,ruta):

        search=self.catalog(path=ruta,
            object_provides="Products.ATContentTypes.interfaces.image.IATImage",
            sort_on='modified',
            sort_order='reverse')

        if len(search)>0:
            padreObj=self.portal.unrestrictedTraverse(ruta)
            img=padreObj[search[0].id]
            return img
        else:
            return None


    @memoize
    def _data(self):
        limit = self.data.count
        folder = self.data.canal
        self.idCanal=folder.split("/")[-1]
        ##recreaFolder= self.getContainer(folder.encode('utf8'))
        result=self.catalog(
            path=folder,
            sort_on='modified',
            object_provides=("Products.bpContents.articulo.IArticulo",
                             "Products.bpContents.galeria.IGaleria",
                             "Products.bpContents.evento.IEvento",),
            sort_order='reverse')[:limit+1]

        return result

    @memoize
    def getContainer(self, path):
        if not path:
            return None
        if path.startswith('/'):
            path = path[1:]
        if not path:
            return None

        return aq_inner(self.portal).restrictedTraverse(path, default=None)

class AddForm(base.AddForm):
    form_fields = form.Fields(IInteresesPortlet)
    label = _(u"Add Recent Portlet")
    description = _(u"This portlet displays recently modified content.")

    def create(self, data):
        return Assignment(count=data.get('count', 3),canal=data.get('canal',[]))

class EditForm(base.EditForm):
    form_fields = form.Fields(IInteresesPortlet)
    label = _(u"Edit Recent Portlet")
    description = _(u"This portlet displays recently modified content.")